//package org.gim.qs;
//
//import cn.afterturn.easypoi.excel.ExcelImportUtil;
//import cn.afterturn.easypoi.excel.entity.ImportParams;
//import com.qiwenshare.ufop.util.RedisUtil;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.net.ftp.FTP;
//import org.apache.commons.net.ftp.FTPClient;
//import org.apache.commons.net.ftp.FTPFile;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.scheduling.annotation.EnableScheduling;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.stereotype.Component;
//import org.springframework.transaction.annotation.Transactional;
//
//import javax.annotation.Resource;
//import java.io.IOException;
//import java.io.InputStream;
//import java.util.List;
//
//@Component
//@EnableScheduling
//@Slf4j
//public class QualityInspectionDataSync {
//
//    @Resource
//    private RedisUtil redisUtil;
//
//    private static final String prefix = "Dfs_quality_sync_data";
//
//    @Value("${ftp.host}")
//    private String ftpHost;
//
//    @Value("${ftp.port}")
//    private int ftpPort;
//
//    @Value("${ftp.user}")
//    private String ftpUser;
//
//    @Value("${ftp.password}")
//    private String ftpPass;
//
//    @Value("${ftp.fileName}")
//    private String fileName;
//
//    private static final int MAX_RETRY = 3;
//    private static final int RETRY_DELAY_MS = 3000; // 3秒间隔
//
//    @Scheduled(cron = "0 */2 * * * ?")  // 每5分钟执行一次
//    @Transactional
//    public String runTask() {
//        log.info("开始同步质量数据...");
//        String remoteDir = "/customer/data/";
//
//        int attempt = 0;
//        boolean success = false;
//
//        while (attempt < MAX_RETRY && !success) {
//            attempt++;
//            FTPClient ftpClient = new FTPClient();
//
//            try {
//                log.info("第 {} 次尝试连接 FTP...", attempt);
//
//                // 连接FTP
//                connectToFtp(ftpClient);
//
//                // 切换目录
//                if (!ftpClient.changeWorkingDirectory(remoteDir)) {
//                    throw new IOException("无法进入目录：" + remoteDir);
//                }
//
//                // 确认文件存在
//                FTPFile[] files = ftpClient.listFiles();
//                boolean exists = false;
//                for (FTPFile f : files) {
//                    if (f.getName().equals(fileName)) {
//                        exists = true;
//                        break;
//                    }
//                }
//                if (!exists) {
//                    log.warn("⚠️ 文件不存在：{}", fileName);
//                    return "";
//                }
//
//                // 读取文件流并解析
//                try (InputStream inputStream = ftpClient.retrieveFileStream(fileName)) {
//                    if (inputStream == null) {
//                        throw new IOException("无法获取文件流，可能是权限或路径问题");
//                    }
//
//                    ImportParams params = new ImportParams();
//                    params.setTitleRows(0);
//                    params.setHeadRows(1);
//                    params.setStartRows(2); // 从第4行起（0-based）
//
//                    List<QualityInspectionDataExcelReq> list =
//                            ExcelImportUtil.importExcel(inputStream, QualityInspectionDataExcelReq.class, params);
//
//                    log.info("✅ 成功读取 Excel，共 {} 条记录", list.size());
//                    list.forEach(System.out::println);
//
//                    success = true; // ✅ 本次执行成功
//                }
//
//                ftpClient.completePendingCommand();
//                ftpClient.logout();
//
//            } catch (Exception e) {
//                log.error("❌ 第 {} 次执行失败：{}", attempt, e.getMessage());
//                if (attempt < MAX_RETRY) {
//                    log.info("⏳ 等待 {} 秒后重试...", RETRY_DELAY_MS / 1000);
//                    try {
//                        Thread.sleep(RETRY_DELAY_MS);
//                    } catch (InterruptedException ie) {
//                        Thread.currentThread().interrupt();
//                    }
//                }
//            } finally {
//                try {
//                    if (ftpClient.isConnected()) {
//                        ftpClient.logout();
//                        ftpClient.disconnect();
//                    }
//                } catch (Exception e) {
//                    log.warn("⚠️ 断开 FTP 连接时异常：{}", e.getMessage());
//                }
//            }
//        }
//
//        if (!success) {
//            log.error("🚨 同步任务失败，已重试 {} 次仍未成功。", MAX_RETRY);
//        } else {
//            log.info("✅ 质量数据同步任务完成！");
//        }
//
//        return "";
//    }
//
//    /**
//     * 连接 FTP 服务器（带超时和验证）
//     */
//    private void connectToFtp(FTPClient ftpClient) throws IOException {
//        ftpClient.setControlEncoding("UTF-8");
//        ftpClient.setConnectTimeout(10000);
//        ftpClient.setDataTimeout(10000);
//        ftpClient.connect(ftpHost, ftpPort);
//
//        int replyCode = ftpClient.getReplyCode();
//        if (!ftpClient.isConnected() || replyCode >= 400) {
//            throw new IOException("无法连接FTP服务器，返回码：" + replyCode);
//        }
//
//        if (!ftpClient.login(ftpUser, ftpPass)) {
//            throw new IOException("FTP登录失败，请检查用户名或密码");
//        }
//
//        ftpClient.enterLocalPassiveMode();
//        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
//        log.info("✅ 已连接到 FTP：{}:{}", ftpHost, ftpPort);
//    }
//
//    /**
//     * 连接 SFTP 服务器（带超时和验证）
//     */
//    private void connectToSFtp(FTPClient ftpClient) throws IOException {
//        ftpClient.setControlEncoding("UTF-8");
//        ftpClient.setConnectTimeout(10000);
//        ftpClient.setDataTimeout(10000);
//        ftpClient.connect(ftpHost, ftpPort);
//
//        int replyCode = ftpClient.getReplyCode();
//        if (!ftpClient.isConnected() || replyCode >= 400) {
//            throw new IOException("无法连接FTP服务器，返回码：" + replyCode);
//        }
//
//        if (!ftpClient.login(ftpUser, ftpPass)) {
//            throw new IOException("FTP登录失败，请检查用户名或密码");
//        }
//
//        ftpClient.enterLocalPassiveMode();
//        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
//        log.info("✅ 已连接到 FTP：{}:{}", ftpHost, ftpPort);
//    }
//}
